GList *group_link;
guint n_points;
guint recognized : 1;
+ guint touchpad : 1;
};
static guint signals[N_SIGNALS] = { 0 };
G_OBJECT_CLASS (gtk_gesture_parent_class)->finalize (object);
}
+static guint
+_gtk_gesture_get_n_touchpad_points (GtkGesture *gesture,
+ gboolean only_active)
+{
+ GtkGesturePrivate *priv;
+ PointData *data;
+
+ priv = gtk_gesture_get_instance_private (gesture);
+
+ if (!priv->touchpad)
+ return 0;
+
+ data = g_hash_table_lookup (priv->points, NULL);
+
+ if (!data)
+ return 0;
+
+ if (only_active &&
+ (data->state == GTK_EVENT_SEQUENCE_DENIED ||
+ (data->event->type == GDK_TOUCHPAD_SWIPE &&
+ data->event->touchpad_swipe.phase == GDK_TOUCHPAD_GESTURE_PHASE_END) ||
+ (data->event->type == GDK_TOUCHPAD_PINCH &&
+ data->event->touchpad_pinch.phase == GDK_TOUCHPAD_GESTURE_PHASE_END)))
+ return 0;
+
+ switch (data->event->type)
+ {
+ case GDK_TOUCHPAD_SWIPE:
+ return data->event->touchpad_swipe.n_fingers;
+ case GDK_TOUCHPAD_PINCH:
+ return data->event->touchpad_pinch.n_fingers;
+ default:
+ return 0;
+ }
+}
+
static guint
_gtk_gesture_get_n_touch_points (GtkGesture *gesture,
gboolean only_active)
_gtk_gesture_get_n_physical_points (GtkGesture *gesture,
gboolean only_active)
{
- return _gtk_gesture_get_n_touch_points (gesture, only_active);
+ GtkGesturePrivate *priv;
+
+ priv = gtk_gesture_get_instance_private (gesture);
+
+ if (priv->touchpad)
+ return _gtk_gesture_get_n_touchpad_points (gesture, only_active);
+ else
+ return _gtk_gesture_get_n_touch_points (gesture, only_active);
}
static gboolean
GdkWindow *widget_window;
GtkGesturePrivate *priv;
GdkDevice *device;
- gboolean existed;
+ gboolean existed, touchpad;
PointData *data;
if (!gdk_event_get_coords (event, NULL, NULL))
if (!widget_window)
return FALSE;
+ touchpad = EVENT_IS_TOUCHPAD_GESTURE (event);
+
if (add)
{
/* If the event happens with the wrong device, or
return FALSE;
if (priv->user_window && priv->user_window != widget_window)
return FALSE;
+
+ /* Make touchpad and touchscreen gestures mutually exclusive */
+ if (touchpad && g_hash_table_size (priv->points) > 0)
+ return FALSE;
+ else if (!touchpad && priv->touchpad)
+ return FALSE;
}
else if (!priv->device || !priv->window)
return FALSE;
{
priv->window = widget_window;
priv->device = device;
+ priv->touchpad = touchpad;
}
data = g_new0 (PointData, 1);
{
priv->window = NULL;
priv->device = NULL;
+ priv->touchpad = FALSE;
}
}
priv->last_sequence = sequence;
if (event->type == GDK_BUTTON_PRESS ||
- event->type == GDK_TOUCH_BEGIN)
+ event->type == GDK_TOUCH_BEGIN ||
+ (event->type == GDK_TOUCHPAD_SWIPE &&
+ event->touchpad_swipe.phase == GDK_TOUCHPAD_GESTURE_PHASE_BEGIN) ||
+ (event->type == GDK_TOUCHPAD_PINCH &&
+ event->touchpad_pinch.phase == GDK_TOUCHPAD_GESTURE_PHASE_BEGIN))
{
if (_gtk_gesture_update_point (gesture, event, TRUE))
{
}
}
else if (event->type == GDK_BUTTON_RELEASE ||
- event->type == GDK_TOUCH_END)
+ event->type == GDK_TOUCH_END ||
+ (event->type == GDK_TOUCHPAD_SWIPE &&
+ event->touchpad_swipe.phase == GDK_TOUCHPAD_GESTURE_PHASE_END) ||
+ (event->type == GDK_TOUCHPAD_PINCH &&
+ event->touchpad_pinch.phase == GDK_TOUCHPAD_GESTURE_PHASE_END))
{
if (_gtk_gesture_update_point (gesture, event, FALSE))
{
}
}
else if (event->type == GDK_MOTION_NOTIFY ||
- event->type == GDK_TOUCH_UPDATE)
+ event->type == GDK_TOUCH_UPDATE ||
+ (event->type == GDK_TOUCHPAD_SWIPE &&
+ event->touchpad_swipe.phase == GDK_TOUCHPAD_GESTURE_PHASE_UPDATE) ||
+ (event->type == GDK_TOUCHPAD_PINCH &&
+ event->touchpad_pinch.phase == GDK_TOUCHPAD_GESTURE_PHASE_UPDATE))
{
if (event->type == GDK_MOTION_NOTIFY)
{
}
else if (event->type == GDK_TOUCH_CANCEL)
{
- _gtk_gesture_cancel_sequence (gesture, sequence);
+ if (!priv->touchpad)
+ _gtk_gesture_cancel_sequence (gesture, sequence);
+ }
+ else if ((event->type == GDK_TOUCHPAD_SWIPE &&
+ event->touchpad_swipe.phase == GDK_TOUCHPAD_GESTURE_PHASE_CANCEL) ||
+ (event->type == GDK_TOUCHPAD_PINCH &&
+ event->touchpad_pinch.phase == GDK_TOUCHPAD_GESTURE_PHASE_CANCEL))
+ {
+ if (priv->touchpad)
+ _gtk_gesture_cancel_sequence (gesture, sequence);
}
else if (event->type == GDK_GRAB_BROKEN)
{